﻿/**
* @file     Time.h
* @brief    This class is a time toolkit with Hong.
* @details  一个简单的跨Window和Linux的C++时间工具类
*                        
* @author   TangC. goko-712@163.com.  
* @version  0.9.0(版本号).   
* @date     2016-11-23.
*/
#pragma once
#include <string>
#ifndef WIN32
	#include <sys/time.h>
#endif


//
// Int64 typedef
//
#ifdef _MSC_VER
//
// With Visual C++, long is always 32-bit
//
typedef __int64 Int64;
#elif defined(UTIL_64)
typedef long Int64;
#else
typedef long long Int64;
#endif
//
// INT64: macro for Int64 literal values
//
#if defined(_MSC_VER)
#   define INT64(n) n##i64
#elif defined(UTIL_64)
#   define INT64(n) n##L
#else
#   define INT64(n) n##LL
#endif

namespace Hong{
class Time
{
public:
	Time(void);
	~Time(void);
	/**
    * @brief 获取系统的当前时间，并保存到Time对象中
	* @return Time对象
	*/
	static Time currentTime();
	
	/**
	* @brief 根据给定秒数(1970至今),生成时间对象
	* @param[in] t 整型数字表示的时间
	* @return 时间对象
	*/
    static Time seconds(Int64 t);
	/**
	* @brief 根据给定秒数(1970至今),生成时间对象
	* @param[in] t 浮点型数字表示的时间
	* @return 时间对象
	*/
	static Time secondsDouble(double t);
	/**
	* @brief 时间转换为1970年以来的秒数
	* @return 整型时间,秒
	*/
    Int64 toSeconds() const;
	/**
	* @brief 时间转换为1970年以来的秒数
	* @return 浮点型时间,秒
	*/
	double toSecondsDouble() const;
	/**
	* @brief 转换为字符串(格式：YYYY-MM-DD hh:mm:ss)
	* @return 字符串表示的时间
	*/
	std::string toDateTime() const;
	/**
	* @brief 当前时间是否超过了rhs
	* @return 小于返回true,大于返回false
	*/
	bool operator<(const Time& rhs) const;
	/**
	* @brief 从格式为YYYYMMDD的字符串中创建时间对象
	* @param[in] pTimeStr时间字符串
	* @return 创建的时间对象
	*/
	static Time fromTimeString(const char *pTimeStr);
	/**
	* @brief 得到时间中的年份
	* @return 整型数字，如：2016
	*/
	int getYear();
	/**
	* @brief 得到时间中的月份
	* @return 整型数字，如：11 (代表11月)
	*/
	int getMonth();
	/**
	* @brief 得到时间中的第几天
	* @return 整型数字，如：9 (代表9号)
	*/
	int getDay();
    Int64 toMicroSeconds() const;
private:

    Time(Int64 usec);
    Int64 m_usecond; //!< 微秒
};
}

